package br.com.invest.action;

import br.com.invest.model.Grupo;
import br.com.invest.model.Jogador;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.apache.commons.codec.net.BCodec;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.security.Identity;

/**
 *
 * @author Kirmaier
 */
@Name("GrupoController")
@Scope(ScopeType.SESSION)
public class GrupoController implements Serializable {

    public Jogador jogador;
    @DataModel("jogadoresDM") //Cria o datamodel para jogadores

    private List<Jogador> jogadores;
    public final Double valorInicial = 1000000.00;
    @In //Procura a variavel e instancia ela, no caso o BD

    private Session investDB;
    private Grupo grupo;
    private static final String CREATE_GRUPO = "createGrupo";
    private static final String SUCCESS = "success";
    private static final String GRUPO = "grupo";

    @Begin(join = true)
    public String createSetup() {
        grupo = new Grupo();

        jogadores = new ArrayList<Jogador>(0);

        return CREATE_GRUPO;
    }

    @End
    public String create() {

        try {
            if (verificaGrupo()) {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Você deve cadastrar no minimo 2 jogadores, e no máximo 4.", null));
                return null;
            }

            String senhaCriptografada = null;

            BCodec b = new BCodec();

            senhaCriptografada = grupo.getSenha();

            grupo.setSenha(b.encode(senhaCriptografada));

            grupo.setSaldo(valorInicial);

            //Salva o grupo
            investDB.save(grupo);


            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Grupo criado com sucesso!", null));
            return SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao criar o grupo: " + e.getMessage(), null));
            return null;
        }

    }

    public boolean verificaGrupo() {
        jogadores.clear();
        jogadores.addAll(grupo.getJogadores());
        if (jogadores.size() < 2 || jogadores.size() > 4) {

            return true;
        }
        return false;
    }

    public String getGrupoJogadores() {
        //      grupo = new Grupo();

        jogadores = new ArrayList<Jogador>(0);

        Criteria c = investDB.createCriteria(Grupo.class);
        c.add(Restrictions.eq("login", Identity.instance().getUsername()));

        grupo = (Grupo) c.uniqueResult();

        jogadores.clear();
        jogadores.addAll(grupo.getJogadores());

        return GRUPO;
    }

    public String createJogadorSetup() {
        jogador = new Jogador();

        return null;
    }

    public String addJogadorGrupo() {

        //Injeta o Jogador dentro do Grupo
        grupo.addJogador(jogador);
        //Limpa lista de jogadores do grupo
        jogadores.clear();
        //Adiciona todos os jogadores do grupo na lista
        jogadores.addAll(grupo.getJogadores());

        return null;
    }

    //<editor-fold defaultstate="collapsed" desc="Getters e Setters" >
    public Grupo getGrupo() {
        return grupo;
    }

    public void setGrupo(Grupo grupo) {
        this.grupo = grupo;
    }

    public Jogador getJogador() {
        return jogador;
    }

    public void setJogador(Jogador jogador) {
        this.jogador = jogador;
    }

    public List<Jogador> getJogadores() {
        return jogadores;
    }

    public void setJogadores(List<Jogador> jogadores) {
        this.jogadores = jogadores;
    }
    //</editor-fold>
}